package ventas;

import sucursal.Sucursal;
import clientes.Cliente;
import clientes.ListaDeCompras;
import envios.EnvioAPagar;
import exceptions.VentaYaAbonadaException;
import exceptions.VentasException;

public class VentaConEnvioAPagar extends VentaConEnvio {
	
	private float dineroEnEfectivo;

	public VentaConEnvioAPagar(ListaDeCompras unaListaDeCompras,
			Sucursal sucursalDondeSeRealizaLaVenta,
			Cliente clienteQueDeseaRealizarLaCompra,float dinero) {
		super(unaListaDeCompras, sucursalDondeSeRealizaLaVenta,
				clienteQueDeseaRealizarLaCompra);
		this.setDineroEnEfectivo(dinero);
		super.setEnvioAProcesar(new EnvioAPagar(this));
	}
	/**
	 * Realiza el proceso de compra. Caso contrario,
	 * lanzara una excepcion indicando que no pude realizarse
	 * la compra.
	 * @throws VentasException 
	 * @throws StatesException 
	 */
	public void realizarCompra() throws VentasException{
		if(this.getEnvioAProcesar().estaEnProcesoDeEnvio()){
			super.realizarCompra();
			}
		else{
			throw new VentasException("El envio no puede"
					+ "pagarse hasta no llegar a domicilio.");
		}
	}

	/**
	 * @return si el cliente puede pagar los productos.
	 * @throws VentaYaAbonadaException 
	 */
	@Override
	protected boolean elClientePuedePagarLosProductos() throws VentaYaAbonadaException {
		return this.getDineroEnEfectivo() >=
				this.montoAPagarPorLosProductos();
	}

	/**
	 * cobrara los productos al cliente.
	 * @throws VentasException 
	 */
	@Override
	protected void cobrarProductos() throws VentasException {
		this.setDineroEnEfectivo(this.getDineroEnEfectivo() - 
				this.montoAPagarPorLosProductos());
		this.entregarTicket();
	}
	
	/**
	 * Retorna los productos que estaban siendo por ser
	 * comprados a la sucursal donde se realiza la compra.
	 */
	@Override
	public void devolverProductos() {
		this.getSucursalDondeSeRealizaLaVenta().agregarStockAlStockDeSucursal(
				this.transformarAStock(
						this.getProductosQueDeseaComprar()));
	}
	
	/**
	 * @return el dinero en efectivo con el cual
	 * abonara el cliente.
	 */
	public float getDineroEnEfectivo() {
		return dineroEnEfectivo;
	}

	/**
	 * @param dineroEnEfectivo es el dinero en efectivo con el cual
	 * abonara el cliente.
	 */
	private void setDineroEnEfectivo(float dineroEnEfectivo) {
		this.dineroEnEfectivo = dineroEnEfectivo;
	}
	
}